import Diccionario
import Busqueda
import HUnit
import Maybe

-- evaluar t para correr todos los tests
t = runTestTT allTests

allTests = test [ 
    "diccionario" ~: testsDiccionario,
    "busquedaDelTesoro" ~: testsBusquedaDelTesoro
    ]

------- Data de prueba -------

dicc0 :: Diccionario Int String
dicc0 = vacio (<)

dicc1::Diccionario Int String
dicc1 = definirVarias [(0,"Hola"),(-10,"Chau"),(15,"Felicidades"),(2,"etc."),(9,"a")] (vacio (<))

dicc2::Diccionario String String
dicc2 = definirVarias [("inicio","casa"),("auto","flores"),("calle","auto"),("casa","escalera"),("ropero","alfajor"),("escalera","ropero")] (vacio (<))

dicc3::Diccionario Int String
dicc3 = definirVarias [(0,"Hola"),(-10,"Chau"),(15,"Felicidades"),(2,"etc."),(9,"a")] (vacio (\x y->x `mod` 5 < y `mod` 5))

------- Tests por ejercicio -------

testsDiccionario = test [
    Nothing ~=? obtener 1 dicc0,
    "a"  ~=? fromJust (obtener 1 (definir 1 "a" dicc0)),
    "Hola" ~=? fromJust (obtener 0 dicc1),
    "flores" ~=? fromJust (obtener "auto" dicc2),
    "etc." ~=? fromJust (obtener 2 dicc3),
    Just "casa" ~=?  obtener "inicio" dicc2,


    [] ~=? claves dicc0,
    [0,-10,15,2,9] ~~? claves dicc1
    ]

testsBusquedaDelTesoro = test [
    --se encuentra el tesoro
    "alfajor" ~=? fromJust (búsquedaDelTesoro "inicio" ((=='a').head) dicc2),
    --la pista no conduce al tesoro
    Nothing ~=? búsquedaDelTesoro "inicio" (=="auto") dicc2,
    --no se encuentra la primer pista
    Nothing ~=? búsquedaDelTesoro "zarlanga" (=="auto") dicc2
    ]

-- idem ~=? pero sin importar el orden
(~~?) :: (Ord a, Eq a, Show a) => [a] -> [a] -> Test
expected ~~? actual = (sort expected) ~=? (sort actual)
    where
        sort = foldl (\r e -> push r e) []
        push r e = (filter (e<=) r) ++ [e] ++ (filter (e>) r)